# -*- coding: utf-8 -*-
# @Author  : pony.guan
# @Time    : 2021/12/27 14:59
# Description: 子线程发信号


import sys
import time
from threading import Thread
from PyQt5.QtWidgets import QApplication, QMainWindow

from untitled import Ui_MainWindow
from PyQt5.QtCore import QObject, pyqtSignal

"""
Qt建议： 只在主线程中操作界面  (在另外一个线程直接操作界面，可能会导致意想不到的问题，比如：输出显示不全，甚至程序崩溃)

改进: 更新界面在主线程中进行，子线程只发信号

"""

"""
自定义信号的流程:
① 定义信号类，实例化
② 定义槽函数  
③ 绑定信号和槽
④ 发射信号



"""


# ① 定义信号类，实例化
class MySignals(QObject):
    # 定义一个叫text_print的信号， 该信号有一个str类型的参数
    text_print = pyqtSignal(str)

    # 还可以定义其他种类的信号
    text_print_2 = pyqtSignal(str)


global_ms = MySignals()


class MyMainForm(QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super(MyMainForm, self).__init__(parent)
        self.setupUi(self)

        # ③ 绑定信号和槽
        global_ms.text_print.connect(self.print_to_gui)
        global_ms.text_print_2.connect(self.print_to_gui_2)
        # self.pushButton.clicked.connect(self.test)
        # self.pushButton.clicked.connect(self.thread_test)
        self.pushButton.clicked.connect(self.signal_thread_test)
        self.pushButton_2.clicked.connect(self.signal_thread_test_2)

    # ② 定义槽函数
    def print_to_gui(self, text):
        self.textBrowser.append(str(text))

    def print_to_gui_2(self, text):
        self.textBrowser_2.append(str(text))

    def signal_thread_test(self):
        """
        @desc 动态显示输出，需要用子线程
        :return:
        """
        self.pushButton.setEnabled(False)  # 点击按钮后，立马禁用

        def func():
            for i in range(6):
                time.sleep(1)
                # ④ 发射信号
                global_ms.text_print.emit(f'执行时间: {i}')

            self.pushButton.setEnabled(True)  # 任务执行完后，按钮解除禁用

        t = Thread(target=func)
        t.start()

    def signal_thread_test_2(self):
        """
        @desc 动态显示输出，需要用子线程
        :return:
        """
        self.pushButton_2.setEnabled(False)  # 点击按钮后，立马禁用

        def func():
            for i in range(6):
                time.sleep(1)
                # ④ 发射信号
                global_ms.text_print_2.emit(f'执行时间: {i*2}')

            self.pushButton_2.setEnabled(True)  # 任务执行完后，按钮解除禁用

        t = Thread(target=func)
        t.start()


if __name__ == "__main__":
    app = QApplication(sys.argv)

    myWin = MyMainForm()

    myWin.show()

    sys.exit(app.exec_())
